为什么是 PyVista?

VTK 是一个出色的可视化工具包,并且有了 Python 绑定,它应该能够结合 C++ 的速度和 Python 的快速原型开发能力。然而,尽管如此,用 Python 编写的 VTK 代码通常看起来与其 C++ 对应代码相同。本模块试图简化网格创建和绘图,同时不丢失功能。

比较两种从文件加载和绘制表面网格的方法:

使用 Python 的 VTK 绘制网格

以本示例为基线,仅使用 vtk 库加载和绘制 STL 文件需要大量代码。而 PyVista 只需要几行代码。

. PyVista 另一方面只需要几行代码。

使用 vtk 读取并绘制 STL 文件 使用 PyVista 读取 STL 文件
import vtk reader = vtk.vtkSTLReader() reader.SetFileName("bunny.stl") mapper = vtk.vtkDataSetMapper() output_port = reader.GetOutputPort() mapper.SetInputConnection(output_port) actor = vtk.vtkActor() actor.SetMapper(mapper) ren = vtk.vtkRenderer() renWin = vtk.vtkRenderWindow() renWin.AddRenderer(ren) iren = vtk.vtkRenderWindowInteractor() style = vtk.vtkInteractorStyleTrackballCamera() iren.SetRenderWindow(renWin) iren.SetInteractorStyle(style) ren.AddActor(actor) iren.Initialize() renWin.Render() iren.Start() del iren, renWin import pyvista as pv mesh = pv.read('bunny.stl') mesh.plot()

PyVista 数据模型和 API 允许您快速加载网格,并处理许多“粗活”,例如设置绘图、连接类和管线以及清理绘图窗口。它通过向 VTK 的类暴露一个简化但功能性的接口来实现这一点。

在 pyvista.read() 中,PyVista 根据文件扩展名自动确定正确的文件读取器,并返回一个 DataSet 对象。该数据集对象包含 pyvista.PolyData 类可用的所有方法,包括 plot 方法,允许您即时生成网格图。垃圾回收自动处理,并且在用户关闭绘图窗口后渲染器被清理。

有关比较两种 API 的更多详细信息,请参阅 PyVista 数据模型 和 从 VTK 过渡到 PyVista。

PyVista API

例如,VTK 中的三角表面网格可以细分,但 VTK 中的每个其他对象都不能。因此,将 pyvista.PolyDataFilters.subdivide() 方法添加到现有的三角表面网格是有意义的。这样,细分可以通过如下方式执行:

code.matlab
import pyvista as pv
mesh = pv.Plane().triangulate()
submesh = mesh.subdivide(2, 'linear')
submesh.plot(show_edges=True)
Document Image
\[\]

此外,PyVista 中所有方法的文档字符串旨在用于交互式编码会话。这允许用户在运行时使用复杂的处理例程,并立即访问有关如何使用这些方法的描述:

Document Image
\[\]
code.matlab
from pyvista import examples
[1]: mesh = examples.load_ant()
mesh
PolyData Information
[1]:
N Cells 912
N Points 486
X Bounds -1.601e+01,1.601e+01
Y Bounds -9.385e+00,9.385e+00
Z Bounds -1.678e+01,1.678e+01
0 N Arrays
submesh = mesh. []:

与其他库的接口

PyVista 严重依赖 numpy,并使用它表示来自 VTK 网格的点、单元、字段和其他数据。这些数据可以轻松地从数据集属性(如 pyvista.DataSet.points)访问。例如,可以通过以下方式访问 PyVista 中圆的前 10 个点:

code.matlab
circle = pv.Circle()
circle.points[:10]

并且这些点可以像操作 NumPy 数组一样操作,而不会丢失与底层 VTK 数据数组的连接。

同时,可以直接从 numpy 数组生成各种 PyVista 对象。例如,下面我们使用 numpy.meshgrid() 生成箭头向量场:

code.matlab
import pyvista as pv
import numpy as np
# 制作一个网格
x, y, z = np.meshgrid(np.linspace(-5, 5, 20),
                      np.linspace(-5, 5, 20),
                      np.linspace(-5, 5, 5),
                      indexing='ij')
points = np.empty((x.size, 3))
points[:, 0] = x.ravel('F')
points[:, 1] = y.ravel('F')
points[:, 2] = z.ravel('F')
# 计算向量场的方向
direction = np.sin(points)**3
# 使用绘图类绘制
pl = pv.Plotter()
pl.add_arrows(points, direction, 0.5)
pl.show()
Document Image
\[\]

PyVista 与多个其他库有连接,例如 meshio 和 matplotlib,允许 PyVista 用 Python 生态系统的功能扩展 VTK。